/*
* Copyright (c) 2016 ShopJsp. All Rights Reserved.
 * ============================================================================
 * 版权所有 2011 - 今 北京华宇盈通科技有限公司，并保留所有权利。
 * ----------------------------------------------------------------------------
 * 提示：在未取得SHOPJSP商业授权之前，您不能将本软件应用于商业用途，否则SHOPJSP将保留追究的权力。
 * ----------------------------------------------------------------------------
 * 官方网站：http://www.shopjsp.com
 * ============================================================================
*/
package com.hyyt.shopjsp.util.upload;

import com.hyyt.shopjsp.util.common.StringStaticKey;
import com.hyyt.shopjsp.util.common.Utils;
import com.hyyt.shopjsp.util.exception.ServiceException;
import com.hyyt.shopjsp.util.redis.util.RedisDataReadUtil;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.util.Date;


/**
 * 工具类 - 上传图片文件处理，文件名路径处理
 * 
 * */
public class FileUploadUtil {

	/**
	 * 上传图片文件拓展名，生成新的文件名。
	 *
	 * @param imagePath
	 *            传入文件路径
	 * @param imagePathFileName
	 *            文件路径名称包含文件名称
	 *
	 * @param imageInfoPath
	 *            获取配置文件systemConfig.properties中文件保存详细划分路径
	 * @return 全新路径和文件地址
	 */
	public static String uploadImageFile(MultipartFile imagePath, String imagePathFileName, String imageInfoPath)  {
		if (imagePath != null) {
			// 1上传文件的类型
			String typeStr = imagePathFileName.substring(imagePathFileName.lastIndexOf("."));
			//判断图片后缀是否符合要求，忽略大小写的判断
			if ( FileTypeUtil.checkIsImage(typeStr) ) {
				// 需要修改文件的后缀名称
				String newName = imagePathFileName.substring(imagePathFileName.lastIndexOf("."));
				// 生成随机文件名：当前年月日时分秒+五位随机数（为了在实际项目中防止文件同名而进行的处理）
				String randomCode= Utils.getRandomCode();
				//原始图片文件编译后的新名称
				newName = randomCode + newName;
				//定义新文件保存实际路径+配置文件systemConfig.properties中定义的文件生成目录规则：年月日
				String newImagePath = RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_SHOP) + "/"+ RedisDataReadUtil.getSysConfig(imageInfoPath) + "/"+ FileTypeUtil.getSerial(new Date(), RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_RULE)) + "/" ;
				//定义文件对象，需要加上盘符
				File savefile = new File((RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_UPLOAD_ROOT) + "/"+ newImagePath), newName);
				//判断文件是否存在，不存在则新创建
				if (!savefile.getParentFile().exists()) {
					savefile.getParentFile().mkdirs();
				}
				imagePathFileName = newImagePath + newName;
				//保存
				try {
					imagePath.transferTo(savefile);
					return imagePathFileName;
				} catch (Exception e) {
					new ServiceException("文件上传失败！"+e.toString());
					return null;
				}
			}
		}
		return imagePathFileName;
	}

	/**
	 * 备注：后台使用
	 *
	 * 上传图片文件拓展名，生成新的文件名。
	 * @param imagePath 传入文件路径
	 * @param imagePathFileName 文件路径名称包含文件名称
	 * @param subSysFolderName 子系统目录
	 * @param imageInfoPath 图片分支路径
	 * @return 全新路径和文件地址
	 */
	public static UploadResult uploadImagesFile(MultipartFile imagePath, String imagePathFileName, String subSysFolderName, String imageInfoPath)  {
		if (imagePath != null) {
			// 1上传文件的类型
			String typeStr = imagePathFileName.substring(imagePathFileName.lastIndexOf("."));
			//判断图片后缀是否符合要求，忽略大小写的判断
			if (!FileTypeUtil.checkIsImage(typeStr)) {
				return new UploadResult(false, null,"图片上传失败，请上传gif,jpg,jpeg,png,bmp格式的图片");
			}

			//检查上传图片的内存大小，是否超出预设
			Long solitaryImageMaxByte = Long.parseLong(RedisDataReadUtil.getSysConfig("solitaryImageMaxByte"));
			if (FileTypeUtil.checkFileSizeIsOver(imagePath, solitaryImageMaxByte)) {
				return new UploadResult(false, null, "图片上传失败，请上传所占内存小于[" + solitaryImageMaxByte/ 1024  + "k]的图片");
			}

			// 需要修改文件的后缀名称
			String newName = imagePathFileName.substring(imagePathFileName.lastIndexOf("."));
			// 生成随机文件名：当前年月日时分秒+五位随机数（为了在实际项目中防止文件同名而进行的处理）
			String randomCode= Utils.getRandomCode();
			//原始图片文件编译后的新名称
			newName = randomCode + newName;
			//定义新文件保存实际路径+配置文件systemConfig.properties中定义的文件生成目录规则：年月日
			String newImagePath = RedisDataReadUtil.getSysConfig(subSysFolderName) + "/"+ RedisDataReadUtil.getSysConfig(imageInfoPath) + "/"+ FileTypeUtil.getSerial(new Date(), RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_RULE)) + "/" ;
			//定义文件对象，需要加上盘符
			File savefile = new File((RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_UPLOAD_ROOT) + "/"+ newImagePath), newName);

			//判断文件是否存在，不存在则新创建
			if (!savefile.getParentFile().exists()) {
				savefile.getParentFile().mkdirs();
			}
			imagePathFileName = newImagePath + newName;
			//保存
			try {
				imagePath.transferTo(savefile);
				return new UploadResult(true, imagePathFileName);
			} catch (Exception e) {
				return new UploadResult(false, null, "图片上传失败："+e.toString());
			}
		}
		return new UploadResult(false, imagePathFileName, "图片上传失败，请重试");
	}

	/**
	 * 备注：后台使用
	 *
	 * 上传图片文件拓展名，生成新的文件名。
	 * @param videoPath 传入文件路径
	 * @param videoPathFileName 文件路径名称包含文件名称
	 * @param subSysFolderName 子系统目录
	 * @param videoInfoPath 视频分支路径
	 * @return 全新路径和文件地址
	 */
	public static UploadResult uploadVideoFile(MultipartFile videoPath, String videoPathFileName, String subSysFolderName, String videoInfoPath)  {
		if (videoPath != null) {
			// 1上传文件的类型
			String typeStr = videoPathFileName.substring(videoPathFileName.lastIndexOf("."));
			//判断视频后缀是否符合要求，忽略大小写的判断
			if (!FileTypeUtil.checkIsVideo(typeStr)) {
				return new UploadResult(false, null,"视频上传失败，请上传mp4，flv格式的视频");
			}

			//检查上传视频的内存大小，是否超出预设
			Long solitaryVideoMaxByte = Long.parseLong(RedisDataReadUtil.getSysConfig("solitaryVideoMaxByte"));
			if (FileTypeUtil.checkFileSizeIsOver(videoPath, solitaryVideoMaxByte)) {
				return new UploadResult(false, null, "视频上传失败，请上传所占内存小于[" + solitaryVideoMaxByte/ 1024  + "k]的视频");
			}

			// 需要修改文件的后缀名称
			String newName = videoPathFileName.substring(videoPathFileName.lastIndexOf("."));
			// 生成随机文件名：当前年月日时分秒+五位随机数（为了在实际项目中防止文件同名而进行的处理）
			String randomCode= Utils.getRandomCode();
			//原始视频文件编译后的新名称
			newName = randomCode + newName;
			//定义新文件保存实际路径+配置文件systemConfig.properties中定义的文件生成目录规则：年月日
			String newVideoPath = RedisDataReadUtil.getSysConfig(subSysFolderName) + "/"+ RedisDataReadUtil.getSysConfig(videoInfoPath) + "/"+ FileTypeUtil.getSerial(new Date(), RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_RULE)) + "/" ;
			//定义文件对象，需要加上盘符
			File savefile = new File((RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_UPLOAD_ROOT) + "/"+ newVideoPath), newName);

			//判断文件是否存在，不存在则新创建
			if (!savefile.getParentFile().exists()) {
				savefile.getParentFile().mkdirs();
			}
			videoPathFileName = newVideoPath + newName;
			//保存
			try {
				videoPath.transferTo(savefile);
				return new UploadResult(true, videoPathFileName);
			} catch (Exception e) {
				return new UploadResult(false, null, "视频上传失败："+e.toString());
			}
		}
		return new UploadResult(false, videoPathFileName, "视频上传失败，请重试");
	}

	/**
	 * 备注：后台使用
	 *
	 * 上传图片文件拓展名，生成新的文件名。
	 * @param fileStoreUrl 传入文件路径
	 * @return 全新路径和文件地址
	 */
	public static boolean deleteFile(String fileStoreUrl)  {

			//定义文件对象，需要加上盘符
			File deletefile = new File((RedisDataReadUtil.getSysConfig(StringStaticKey.FILE_UPLOAD_ROOT) + "/"+ fileStoreUrl));

			//判断文件是否存在
			if (deletefile.exists()) {
				deletefile.delete();
				return true;
			}else{
				return false;
			}
	}
	

}
